const User = require('../models/User');
const { generateToken } = require('../utils/jwt');
const Joi = require('joi');

// 验证规则
const registerSchema = Joi.object({
  phone: Joi.string().pattern(/^1[3-9]\d{9}$/).required(),
  password: Joi.string().min(6).max(20).required(),
  name: Joi.string().min(2).max(10).required(),
  email: Joi.string().email().optional(),
  city: Joi.string().optional(),
  gender: Joi.string().valid('male', 'female').optional()
});

const loginSchema = Joi.object({
  phone: Joi.string().pattern(/^1[3-9]\d{9}$/).required(),
  password: Joi.string().required()
});

// 用户注册
const register = async (req, res) => {
  try {
    console.log('收到注册请求:', req.body);
    
    // 验证请求数据
    const { error, value } = registerSchema.validate(req.body);
    if (error) {
      console.log('数据验证失败:', error.details[0].message);
      return res.status(400).json({ message: error.details[0].message });
    }

    const { phone, password, name, email, city, gender } = value;

    // 检查手机号是否已存在
    console.log('检查手机号是否存在:', phone);
    const existingUser = await User.findByPhone(phone);
    if (existingUser) {
      console.log('手机号已被注册:', phone);
      return res.status(400).json({ message: '手机号已被注册' });
    }

    console.log('开始创建用户...');
    // 创建用户
    const userId = await User.create({
      phone,
      password,
      name,
      email: email || '',
      city: city || '',
      gender: gender || 'male'
    });

    console.log('用户创建成功，ID:', userId);

    // 生成token
    const token = generateToken({ userId, phone });

    // 获取用户信息（不包含密码）
    const user = await User.findById(userId);
    console.log('获取用户信息成功:', user);

    res.status(201).json({
      message: '注册成功',
      token,
      user
    });
  } catch (error) {
    console.error('注册错误详情:');
    console.error('错误信息:', error.message);
    console.error('错误堆栈:', error.stack);
    res.status(500).json({ message: '服务器错误，注册失败' });
  }
};

// 用户登录
const login = async (req, res) => {
  try {
    console.log('收到登录请求:', req.body);
    
    // 验证请求数据
    const { error, value } = loginSchema.validate(req.body);
    if (error) {
      console.log('数据验证失败:', error.details[0].message);
      return res.status(400).json({ message: error.details[0].message });
    }

    const { phone, password } = value;
    console.log('查找用户:', phone);

    // 查找用户
    const user = await User.findByPhone(phone);
    if (!user) {
      console.log('用户不存在:', phone);
      return res.status(400).json({ message: '手机号或密码错误' });
    }

    console.log('找到用户:', user.id, user.name);

    // 验证密码
    const isValidPassword = await User.verifyPassword(password, user.password);
    console.log('密码验证结果:', isValidPassword);
    
    if (!isValidPassword) {
      console.log('密码错误');
      return res.status(400).json({ message: '手机号或密码错误' });
    }

    // 生成token
    const token = generateToken({ userId: user.id, phone: user.phone });

    // 返回用户信息（不包含密码）
    const userInfo = await User.findById(user.id);

    console.log('登录成功:', userInfo.name);
    
    res.json({
      message: '登录成功',
      token,
      user: userInfo
    });
  } catch (error) {
    console.error('登录错误:', error);
    res.status(500).json({ message: '服务器错误，登录失败' });
  }
};

// 获取当前用户信息
const getMe = async (req, res) => {
  try {
    const user = await User.findById(req.user.userId);
    if (!user) {
      return res.status(404).json({ message: '用户不存在' });
    }

    res.json({ user });
  } catch (error) {
    console.error('获取用户信息错误:', error);
    res.status(500).json({ message: '服务器错误' });
  }
};

module.exports = {
  register,
  login,
  getMe
};